#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
/*******************************************************
        STC8 定义针脚，系统默认值，如果引用"STC8.h"可不定义
*******************************************************/
// adc
sfr ADC_CONTR = 0xbc; //adc
sfr ADC_RES = 0xbd;   //存结果高8位后2位地址
sfr ADC_RESL = 0xbe;  //存低8位地址
sfr ADCCFG = 0xde;    //设置保存方式

/*******************************
        延时函数
*******************************/
void adc_delay(uchar delay_time) // adc延时
{
    uint n;
    while (delay_time--)
    {
        n = 6000;
        while (--n)
            ;
    }
}
void ADC_Init()
{
    P1M0 = 0x00;   //0000 0000 P1.0开启adc；设成高阻，作为输入口
    P1M1 = 0x01;   //0000 0001
    ADCCFG = 0x0f; //
    ADC_CONTR = 0x80;
}
/*******************************
        读取10位ADC值并转换
*******************************/
uint ADC_Value()
{
    uint h_val;
    uint l_val;
    float t;
    uint vol;
    ADC_CONTR |= 0x40; //启动AD转换
    _nop_();
    _nop_();
    while (!(ADC_CONTR & 0x20))
        ;                                          //查询ADC是否完成
    ADC_CONTR &= ~0x20;                            //清完成标志
    ADCCFG = 0x20;                                 //设置ADC结果右对齐，好计算
    h_val = ADC_RES;                               //存高位，2位
    l_val = ADC_RESL;                              //存低位，8位
    t = (h_val * 256 + l_val) * 1.0 / 1024 * 5000; //高2位，低8位合并
    vol = t;                                       //float 转成了 unit
    return vol;
}
uint ADC_Aver(uchar c) //取平均值
{
    uchar i;
    float sum = 0;
    uchar count = 0;
    uint vol;
    uint temp;
    for (i = 0; i < c - 1; i++)
    {
        temp = ADC_Value();
        if (temp > 100)
        {
            sum += temp * 1.0;
            count++;
        }
    }
    sum = sum / count;
    vol = sum;
    return vol;
}
